<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      "use strict";
      // 1. new Object();ojb创建对象
      var obj = new Object();
      // 2.  字面量
      var obj2 = {};

      // 3. 构造函数
      function Star(uname, age) {
        this.uname = uname;
        this.age = age;
        this.sing = function () {
          console.log("我还会唱歌");
        };
      }
      var ldh = new Star("刘德华", 15);
      var zxy = new Star("张学友", 18);

      ldh.sing();
      zxy.sing();
      // 实例成员 和 静态成员
      // 实例成员就是构造函数内部通过this添加的成员
      // 构造函数里面的uname ,age 都是实例成员
      // 实例成员只能通过实例化对象访问

      console.log(ldh.uname); //只能通过对象访问
      // console.log(Star.uname);//错误 不能通过构造函数访问

      // 静态成员 在构造函数本身上添加的成员 sex就是静态成员
      Star.sex = "男";
      Star.university = "just";
      console.log(Star.sex); //只能通过构造函数访问
      // console.log(ldh.sex); //不能通过对象访问

      // 原型对象 是一个对象 作用 就是共享方法
      /*存在的意思 当我们实例化对象是 会开辟内存空间 而我们的方法 是一样的
        很浪费内存 和时间 所以我们用到了prototype */
      /* 原型方法  把不变的方法 的放在里面 实现共享*/
      // console.dir(Star)

      // 实现
      Star.prototype.address = function () {
        console.log(this);

        console.log("我在台湾");
      };

      const x = ldh.address;
      x();
      ldh.address();
      // zxy.address();

      // 为设什么我们可以调用 address方法  对象原型
      //因为 我们的对象 身上  _proto_方法  他指向的就是prototype
      console.dir(ldh);

      console.log(ldh.__proto__); //对象原型
      console.log(Star.prototype); //原型对象
      console.log(Star.prototype.__proto__); //Object
    </script>
  </body>
</html>
